#include <vcl.h>
#include <IniFiles.hpp> //Pour TIniFile
#pragma hdrstop

#include "Eic.h" //Pour EICDisplayException
#include "MTAG_EIC.h"
#include "uParamCourrierEtCarnAdr.h"
#include <FileCtrl.hpp>

//---------------------------------------------------------------------------

#pragma package(smart_init)

#define MODULE_TAG MTAG_UPARAM_COURRIER_ET_CARNADR


static AnsiString aRepDllCarnAdr;        // Répertoire de CarnAdr.dll
static AnsiString aRepTablesCarnAdr;     // Répertoire des tables du Carnet d'adresses
static AnsiString aRepNetDirCarnAdr;     // Répertoire du NetDir à utiliser pour le Carnet d'adresses

static AnsiString aRepDllEicEdito;       // Répertoire de EicEdito.dll
static AnsiString aRepTablesEicEdito;    // Répertoire des tables de l'éditeur
static AnsiString aRepModelesEicEdito;   // Répertoire des modèles
static AnsiString aRepNetDirEicEdito;    // Répertoire du NetDir pour l'éditeur de courrier

/*******************************************************************************

Fonction :

Paramètres d'entrée :

Paramètres de sortie :

Valeur retournée :
*******************************************************************************/
void __fastcall SetRepsCarnAdr (const AnsiString *aRepCarnAdrDLL,
                                const AnsiString *aRepDatas,
                                const AnsiString *aRepNetDir)
{
try
   {
   if (aRepCarnAdrDLL)
      aRepDllCarnAdr = AddSlash(*aRepCarnAdrDLL);
   if (aRepDatas)
      aRepTablesCarnAdr = AddSlash(*aRepDatas);
   if (aRepNetDir)
      aRepNetDirCarnAdr = AddSlash(*aRepNetDir);
   }
catch(Exception &e)
   {
   EICDisplayException(TAG(10), e);
   }
}

/*******************************************************************************

Fonction :

Paramètres d'entrée :

Paramètres de sortie :

Valeur retournée :
*******************************************************************************/
void __fastcall SetRepsCourrier(const AnsiString *aRepEditoDLL,
                                const AnsiString *aRepDatas,
                                const AnsiString *aRepModeles,
                                const AnsiString *aRepNetDir
                                )
{
try
   {
   if (aRepEditoDLL)
      aRepDllEicEdito = AddSlash(*aRepEditoDLL);
   if (aRepDatas)
      aRepTablesEicEdito = AddSlash(*aRepDatas);
   if (aRepModeles)
      aRepModelesEicEdito = AddSlash(*aRepModeles);
   if (aRepNetDir)
      aRepNetDirEicEdito = AddSlash(*aRepNetDir);
   }
catch(Exception &e)
   {
   EICDisplayException(TAG(2), e);
   }
}


/*******************************************************************************
bool __fastcall GetRepsCarnAdr (AnsiString *aRepCarnAdrDLL,
                                AnsiString *aRepDatas)

Fonction : Lit dans la base de registre le nom des chemins des fichiers du
           carnet d'adresses

P.E modifiés : aRepCarnAdrDLL  : Chemin de CarnAdr.dll
               aRepDatas       : Chemin de la table des adresses

Remarque : Toutes les AnsiString qui pointent sur NULL au démarrage ne seront
           pas remplies.
*******************************************************************************/
bool __fastcall GetRepsCarnAdr (AnsiString *aRepCarnAdrDLL,
                                AnsiString *aRepDatas,
                                AnsiString *aRepNetDir,
                                bool bInterbase)
   {
   AnsiString aMessage;
   bool bRetour = true;

   ASSERT(aRepCarnAdrDLL || aRepDatas || aRepNetDir);  //1 des 3 pointeurs doit être non nul sinon ça sert à rien de l'appeler

   try
      {
      if (aRepCarnAdrDLL != NULL)
         *aRepCarnAdrDLL = EmptyStr;
      if (aRepDatas     != NULL)
         *aRepDatas      = EmptyStr;
      if (aRepNetDir    != NULL)
         *aRepNetDir     = EmptyStr;

      /// Phase 1 : On cherche les chemins dans la variable globale
      /////////////////////////////////////////////////////////////
      if (aRepCarnAdrDLL && aRepCarnAdrDLL->IsEmpty())
         *aRepCarnAdrDLL = aRepDllCarnAdr;
      if (aRepDatas && aRepDatas->IsEmpty())
         *aRepDatas = aRepTablesCarnAdr;
      if (aRepNetDir && aRepNetDir->IsEmpty())
         *aRepNetDir = aRepNetDirCarnAdr;

      /// Phase 2 : On fixe le chemin de la DLL sur le répertoire des EXE
      /// SI il n'a pas été localisé.
      /////////////////////////////////////////////////////////////
      if (aRepCarnAdrDLL && aRepCarnAdrDLL->IsEmpty())
         *aRepCarnAdrDLL = ExtractFilePath(Application->ExeName);

      // CarnAdr.DLL
      /////////////////
      if (aRepCarnAdrDLL)
         {
         if (aRepCarnAdrDLL->IsEmpty())
            throw Exception("Le répertoire \"Exe\" de CarnAdr n'est pas paramétré");
         if(!DirectoryExists(*aRepCarnAdrDLL))
            {
            aMessage = "Le répertoire \"Exe\" de CarnAdr ("+*aRepCarnAdrDLL+") n'existe pas";
            *aRepCarnAdrDLL = EmptyStr;
            throw Exception(aMessage);
            }

         *aRepCarnAdrDLL = ExtractShortPathName(*aRepCarnAdrDLL);

         //Ajoute un \ en fin de chaine s'il n'y en a pas
         if (aRepCarnAdrDLL->Length () != aRepCarnAdrDLL->LastDelimiter('\\'))
            *aRepCarnAdrDLL += "\\";
         }

      // Datas (.DB)
      //////////////
      if (aRepDatas && !bInterbase)
         {
         if (aRepDatas->IsEmpty())
            throw Exception("Le répertoire \"Datas\" de CarnAdr n'est pas paramétré");
         else if (!DirectoryExists(*aRepDatas) && !ForceDirectories(*aRepDatas))
            {
            aMessage = "Impossible de créer le répertoire "+*aRepDatas;
            *aRepDatas = EmptyStr;
            throw Exception(aMessage);
            }

         *aRepDatas = ExtractShortPathName(*aRepDatas);

         //Ajoute un \ en fin de chaine s'il n'y en a pas
         if (aRepDatas->Length () != aRepDatas->LastDelimiter('\\'))
            *aRepDatas += "\\";
         }

      }
   catch(Exception &e)
      {
      EICDisplayException(TAG(30), e);
      bRetour = false;
      }
   return bRetour;
   }

/*******************************************************************************
bool __fastcall GetRepsCourrier(AnsiString *aRepEditoDLL, AnsiString *aRepDatas,
                                AnsiString *aRepModeles)

Fonction : Lit dans la base de registre le nom des chemins des fichiers de
           l'éditeur de courrier

P.E modifiés : aRepEditoDLL  : Chemin de EicEdito.dll
               aRepDatas     : Chemin des tables
               aRepCourriers : Chemin des courriers

Remarque : Toutes les AnsiString qui pointent sur NULL au démarrage ne seront
           pas remplies.
*******************************************************************************/
bool __fastcall GetRepsCourrier(AnsiString *aRepEditoDLL,
                                AnsiString *aRepDatas,
                                AnsiString *aRepModeles,
                                AnsiString *aRepNetDir,
                                bool bInterbase)
	{
   AnsiString aMessage;
   bool bRetour = true;

   ASSERT(aRepEditoDLL || aRepDatas || aRepModeles || aRepNetDir);  //1 des 4 pointeurs doit être non nul sinon ça sert à rien de l'appeler

	try
		{
      // Initialisation par defaut
      if (aRepEditoDLL)
         *aRepEditoDLL	   = EmptyStr;
      if (aRepDatas)
         *aRepDatas			= EmptyStr;
      if (aRepModeles)
         *aRepModeles		= EmptyStr;
      if (aRepNetDir)
         *aRepNetDir	      = EmptyStr;

      /// Phase 1 : On cherche les chemins dans la variable globale
      /////////////////////////////////////////////////////////////
       if (aRepEditoDLL && aRepEditoDLL->IsEmpty())
          *aRepEditoDLL = aRepDllEicEdito;
       if (aRepDatas && aRepDatas->IsEmpty())
          *aRepDatas = aRepTablesEicEdito;
       if (aRepModeles && aRepModeles->IsEmpty())
          *aRepModeles = aRepModelesEicEdito;
       if (aRepNetDir && aRepNetDir->IsEmpty())
          *aRepNetDir = aRepNetDirEicEdito;

      /// Phase 2 : On fixe le chemin de la DLL sur le répertoire des EXE
      /// SI il n'a pas été localisé.
      /////////////////////////////////////////////////////////////
      if (aRepEditoDLL && aRepEditoDLL->IsEmpty())
         *aRepEditoDLL = ExtractFilePath(Application->ExeName);

      // Courrier (.DLL)
      /////////////////
      if (aRepEditoDLL != NULL)
         {
         if (aRepEditoDLL->IsEmpty())
            throw Exception("Le répertoire \"Exe\" de EicEdito n'est pas paramétré");
         if(!DirectoryExists(*aRepEditoDLL))
            {
            aMessage = "Le répertoire \"Exe\" de EicEdito ("+*aRepEditoDLL+") n'existe pas";
            *aRepEditoDLL = EmptyStr;
            throw Exception(aMessage);
            }

         *aRepEditoDLL = ExtractShortPathName(*aRepEditoDLL);

         //Ajoute un \ en fin de chaine s'il n'y en a pas
         if (aRepEditoDLL->Length () != aRepEditoDLL->LastDelimiter('\\'))
            *aRepEditoDLL += "\\";
         }

      // Datas (.DB)
      //////////////
      if (aRepDatas && !bInterbase)
         {
         if (aRepDatas->IsEmpty())
            throw Exception("Le répertoire \"Datas\" de EicEdito n'est pas paramétré");
         if (!DirectoryExists(*aRepDatas) && !ForceDirectories(*aRepDatas))
            {
            aMessage = "Impossible de créer le répertoire "+*aRepDatas;
            *aRepDatas = EmptyStr;
            throw Exception(aMessage);
            }

         *aRepDatas = ExtractShortPathName(*aRepDatas);

         //Ajoute un \ en fin de chaine s'il n'y en a pas
         if (aRepDatas->Length () != aRepDatas->LastDelimiter('\\'))
            *aRepDatas += "\\";
         }

      // Modèles (.RTF)
      ///////////////////
      if (aRepModeles && !bInterbase)
            {
         if (aRepModeles->IsEmpty())
            throw Exception("Le répertoire \"Courrier\" de EicEdito n'est pas paramétré");
         if (!DirectoryExists(*aRepModeles) && !ForceDirectories(*aRepModeles))
            {
            aMessage = "Impossible de créer le répertoire "+*aRepModeles;
            *aRepModeles = EmptyStr;
            throw Exception(aMessage);
            }

         *aRepModeles = ExtractShortPathName(*aRepModeles);

         //Ajoute un \ en fin de chaine s'il n'y en a pas
         if (aRepModeles->Length () != aRepModeles->LastDelimiter('\\'))
            *aRepModeles += "\\";
         }
		}
	catch( Exception &e )
		{
		EICDisplayException( TAG(40), e );
      bRetour = false;
		}
   return bRetour;
	}

